﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using EDINavierasLIB;
using System.Data;
using System.Data.SqlClient;
using System.IO;


namespace EDINavierasTest
{
    /// <summary>
    /// Descripción resumida de UnitTest1
    /// </summary>
    [TestClass]
    public class UnitTest1
    {
        public UnitTest1()
        {
            //
            // TODO: Agregar aquí la lógica del constructor
            //
        }

        private TestContext testContextInstance;

        /// <summary>
        ///Obtiene o establece el contexto de las pruebas que proporciona
        ///información y funcionalidad para la ejecución de pruebas actual.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Atributos de prueba adicionales
        //
        // Puede usar los siguientes atributos adicionales conforme escribe las pruebas:
        //
        // Use ClassInitialize para ejecutar el código antes de ejecutar la primera prueba en la clase
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // Use ClassCleanup para ejecutar el código una vez ejecutadas todas las pruebas en una clase
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Usar TestInitialize para ejecutar el código antes de ejecutar cada prueba 
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // Use TestCleanup para ejecutar el código una vez ejecutadas todas las pruebas
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestMethod]
        public void TestCrearArchivo()
        {
            string rutaArchivo = "";
            string[] palabrasReservadas = new string[2];
            palabrasReservadas[0] = "MAIL|mario.pena@shinkasoftware.com";
            palabrasReservadas[1] = "NUMEROCT|123456789";

            /*
             * 1. Se lee la cadena de conexión desde un archivo de configuración, que puede ser de extensión .config o xml.
             * Este archivo lo puede construir como quiera
             */
            string cadenaConexion = @"User ID=sa; Password=12345;Initial Catalog=EDINAVIERAS;Data Source=HOMERO\BOBPATINO";

            /*
             * 2. Se obtiene la plantilla del archivo que se desea generar: Se conecta a la base de datos y 
             * trae la plantilla actual. De pronto para esta parte le podría facilitar mucho guardar el texto
             * de la plantilla en la base de datos. Dejé aquí el nombre de la plantilla porque éste es el que
             * se utiliza en el ambiente de Kimberly, y es el que más conocen
             */
            string textoPlantilla = this.getPlantilla("IFTMBC");

            /*
             * 3. Se recorre el arreglo que llega con las palabras claves y se van reemplazando en el texto de la
             * plantilla. Como aquí no podemos recibir arreglo de dos posiciones, toca recibir al info en un arreglo
             * de una sola dimensión, y que en cada posición llegue PALABRARESERVADA|VALOR, utilizando el pipe (|)
             * para separarlos, entonces sería algo así:
             */
            string palabra = "";
            string valor = "";
            for (int i = 0; i < palabrasReservadas.Length; i++)
            {
                palabra = palabrasReservadas[i].Substring(0, palabrasReservadas[i].IndexOf("|"));
                valor = palabrasReservadas[i].Substring(palabrasReservadas[i].IndexOf("|") + 1);

                textoPlantilla = textoPlantilla.Replace("<" + palabra + ">", valor);
            }

            /*
             * 4. generar el archivo con extensión .edi
             */
            string resultado = this.generarArchivo(textoPlantilla, "IFTMBC");

            //Si llega algo en resultado ocurrió un error
            if (resultado.Length > 0)
            {
                //Esta parte no la he probado como se coporta cuando se llama desde el excel
                throw new Exception("Error en EDINavierasLIB: " + resultado);
            }

            //Retorna la ruta en la que se guardó el archivo
            Assert.AreEqual(1, 1);


        }


        /// <summary>
        /// Retorna el texto de la plantilla
        /// </summary>
        /// <returns></returns>
        private string getPlantilla(string nombrePlantilla)
        {
            string retorno;

            retorno = "";

            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("@Titulo", nombrePlantilla);
            
            String wstring = @"User ID=sa; Password=12345;Initial Catalog=EDINAVIERAS;Data Source=HOMERO\BOBPATINO";
            SqlConnection wcon = new SqlConnection(wstring);
            String var = "";

            var = "GetPlantilla";

            SqlCommand sqlcom = new SqlCommand(var, wcon);

            sqlcom.CommandType = CommandType.StoredProcedure;
            sqlcom.Parameters.Add("@Titulo", SqlDbType.VarChar).Value = nombrePlantilla;


            DataSet ds = new DataSet();
            
            try
            {
                wcon.Open();
                sqlcom.ExecuteNonQuery();
                ds.Clear();
                SqlDataAdapter sqldata = new SqlDataAdapter(sqlcom);
                sqldata.Fill(ds);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                wcon.Close();
            }

            if (ds.Tables[0].Rows.Count > 0)
            {
                retorno = ds.Tables[0].Rows[0]["TEXTO"].ToString();
                retorno = retorno.Replace("\r\n", "'");
            }

            return retorno;
        }


        /// <summary>
        /// Este método genera un archivo con extensión .edi. Retorna una cadena vacía si todo sale OK, de lo cotnrario
        /// retorna mensaje del error producido
        /// </summary>
        /// <param name="texto"></param>
        /// <returns></returns>
        private string generarArchivo(string texto, string titulo)
        {
            string retorno = "";

            try
            {
                string ruta = @"E:\EDI\";
                ruta = Path.Combine(ruta, titulo + ".edi");                


                //Se crea el archivo plano, que a ruta donde se genere la tome también del archivo de configuración
                FileStream fs = File.Create(ruta);


                byte[] bytes = Encoding.UTF8.GetBytes(texto.ToString());

                fs.Write(bytes, 0, bytes.Length);

                fs.Flush();
                fs.Close();

                retorno = ruta;

            }
            catch (Exception ex)
            {
                retorno = ex.Message;
            }

            return retorno;

        }

    }
}
